﻿using FlyingCircusWebIS.Controllers.Utilidades;
using FlyingCircusWebIS.Filtros;
using FlyingCircusWebIS.Models;
using FlyingCircusWebIS.ViewModels.CupomVM;
using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FlyingCircusWebIS.Controllers
{
    [AutenticacaoFilter("A")]
    public class CupomController : Controller
    {

        private ICupomService cupomService;

        public CupomController()
        {
            cupomService = new CupomService();
        }

        public ActionResult Index(string nome = "", string ativo = "")
        {
            CupomIndexVM vm = ConstruirIndexVM(nome, ativo);
            return View(vm);
        }

        public ActionResult Form(string codigo = null)
        {
            CupomFormVM vm;
            if (codigo != null)
            {
                vm = ConstruirFormVMParaEdicao(codigo);
                if (vm == null)
                    return new HttpNotFoundResult();
            }
            else
            {
                vm = ConstruirFormVMParaNovo();
            }

            return View(vm);
        }

        [HttpPost]
        public ActionResult Form(CupomFormVM vm)
        {
            if (ModelState.IsValid)
            {
                bool edicao = vm.Edicao;
                Cupom registro = ConverterFormVM(vm);

                var erros = cupomService.ValidarEntidade(registro, edicao);
                if (erros.Count == 0)
                {
                    if (edicao)
                        cupomService.Atualizar(registro);
                    else
                        cupomService.Adicionar(registro);

                    return RedirectToAction("Index");
                }
                else
                {
                    ModelState.AddModelErrors(erros);
                }
                
            }

            return View(vm);
        }

        public JsonResult Desativar(string codigo)
        {
            cupomService.DesativarPorCodCupom(codigo);
            return Json(new JsonActionResultModel("Registro desativado com sucesso."));
        }


        public JsonResult Ativar(string codigo)
        {
            cupomService.AtivarPorCodCupom(codigo);
            return Json(new JsonActionResultModel("Registro ativado com sucesso."));
        }

        public JsonResult Remover(string codigo)
        {
            JsonActionResultModel jarm = new JsonActionResultModel();

            var erros = cupomService.ValidaRemoverPorCodCupom(codigo);
            if (erros.Count == 0)
            {
                cupomService.RemoverPorCodCupom(codigo);
                jarm.Erro = false;
                jarm.Mensagem = "Registro removido com sucesso!";
            }
            else
            {
                jarm.Erro = true;
                jarm.Mensagem = "Não é possível remover o registro.\n";
                jarm.AddValidationResultErros(erros);
            }

            return Json(jarm);
        }


        // -----------------------------------------------------------------------------------------
        // Métodos auxiliares 
        // -----------------------------------------------------------------------------------------

        private CupomIndexVM ConstruirIndexVM(string nome, string ativo)
        {
            CupomIndexVM vm = new CupomIndexVM();
            List<Cupom> registros = cupomService.ListarFiltro(nome, ativo);

            vm.Registros = registros;
            vm.TotalRegistros = registros.Count;
            vm.ItensAtivo = ListarItensAtivo();
            vm.Nome = nome;
            vm.Ativo = ativo;
            return vm;
        }

        private List<SelectListItem> ListarItensAtivo()
        {
            var itens = new List<SelectListItem>();
            itens.Add(new SelectListItem() { Text = "<Todos>", Value = "" });
            itens.Add(new SelectListItem() { Text = "Sim", Value = "S" });
            itens.Add(new SelectListItem() { Text = "Não", Value = "N" });
            return itens;
        }

        private CupomFormVM ConstruirFormVMParaNovo()
        {
            return new CupomFormVM() { Edicao = false, FlagAtivo = true };
        }

        private CupomFormVM ConstruirFormVMParaEdicao(string codigo)
        {
            Cupom registro = cupomService.BuscarPorCodCupom(codigo);
            if (registro != null)
            {
                CupomFormVM vm = ConverterFormVM(registro);
                vm.Edicao = true;
                return vm;
            }

            return null;
        }

        private CupomFormVM ConverterFormVM(Cupom registro)
        {
            CupomFormVM vm = new CupomFormVM();
            vm.CodCupom = registro.CodCupom;
            vm.NomeCupom = registro.NomeCupom;
            vm.Descricao = registro.Descricao;
            vm.Desconto = (registro.Desconto * 100).ToString("N2");
            vm.FlagAtivo = registro.FlagAtivo.Equals("S");
            return vm;
        }

        private Cupom ConverterFormVM(CupomFormVM vm)
        {
            Cupom registro = new Cupom();
            registro.CodCupom = vm.CodCupom;
            registro.NomeCupom = vm.NomeCupom;
            registro.Descricao = vm.Descricao;
            registro.Desconto = Decimal.Parse(vm.Desconto) / 100;
            registro.FlagAtivo = (vm.FlagAtivo ? "S" : "N");
            return registro;
        }



    }
}
